home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 26 / Cream of the Crop 26.iso / os2 / plnk081.zip / pilot-link.0.8.1 / libsock / syspkt.c < prev    next >
C/C++ Source or Header  |  1997-07-03  |  13KB  |  691 lines

  1. /* syspkt.c:  Pilot SysPkt manager
  2.  *
  3.  * (c) 1996, Kenneth Albanowski.
  4.  * Derived from padp.c.
  5.  *
  6.  * This is free software, licensed under the GNU Public License V2.
  7.  * See the file COPYING for details.
  8.  */
  9.  
  10. #include <stdio.h>
  11. #include <stdarg.h>
  12.  
  13. #include "pi-source.h"
  14. #include "pi-socket.h"
  15. #include "pi-syspkt.h"
  16. #include "pi-slp.h"
  17. #include "pi-serial.h"
  18.  
  19. int sys_RPCerror;
  20.  
  21. int syspkt_tx(struct pi_socket *ps, void *m, int length)
  22. {
  23.   struct pi_skb *nskb;
  24.   unsigned char * msg = m;
  25.  
  26. #ifdef DEBUG
  27.   fprintf(stderr,"-----------------\n");
  28. #endif
  29.  
  30.   /*ps->laddr.pi_port = msg[0];
  31.   ps->raddr.pi_port = msg[1];
  32.   ps->protocol = msg[2]; XXX */
  33.   /*ps->xid = msg[3];*/
  34.   
  35.   if ((!ps->xid) || (ps->xid==0xff)) ps->xid = 0x11; /* some random # */
  36.   ps->xid++;
  37.   ps->xid &= 0xff;
  38.   if ((!ps->xid) || (ps->xid==0xff)) ps->xid = 0x11; /* some random # */
  39.                  
  40.   nskb = (struct pi_skb *)malloc(sizeof(struct pi_skb));
  41.   nskb->source = msg[0];
  42.   nskb->dest = msg[1];
  43.   nskb->type = msg[2];
  44.   nskb->id = ps->xid;
  45.   
  46.   memcpy(&nskb->data[10], msg+4, length-4);
  47.   slp_tx(ps, nskb, length-4);
  48.   
  49.   pi_serial_flush(ps);
  50.  
  51.   return 0;
  52. }
  53.  
  54. int syspkt_rx(struct pi_socket *ps, void *b, int len)
  55. {
  56.   struct pi_skb *skb;
  57.   unsigned char * buf = b;
  58.   int rlen =0;
  59.   
  60.   if (!ps->rxq)
  61.     ps->serial_read(ps, 1);
  62.   
  63.   if (!ps->rxq)
  64.     return 0;
  65.  
  66.   skb = ps->rxq;
  67.   ps->rxq = skb->next;
  68.   
  69.   rlen = skb->len-12;
  70.   
  71.   buf[0] = skb->source;
  72.   buf[1] = skb->dest;
  73.   buf[2] = skb->type;
  74.   buf[3] = skb->id;
  75.  
  76.   memcpy(buf+4, &skb->data[10], rlen);
  77.   
  78.   free(skb);
  79.   return rlen+4;
  80.  
  81. }
  82.  
  83.  
  84. int sys_UnpackState(void * buffer, struct Pilot_state * s)
  85. {
  86.   int i;
  87.   unsigned char * data = buffer;
  88.   
  89.   s->reset = get_short(data);
  90.   s->exception = get_short(data+2);
  91.   memcpy(s->func_name, data+152, 32);
  92.   memcpy(s->instructions, data+78, 30);
  93.   s->func_name[32-1] = 0;
  94.   s->func_start = get_long(data+144);
  95.   s->func_end = get_long(data+148);
  96.   sys_UnpackRegisters(data+4, &s->regs);
  97.  
  98.   for (i=0;i<6;i++) {
  99.     s->breakpoint[i].address = get_long(data+108+i*6);
  100.     s->breakpoint[i].enabled = get_byte(data+112+i*6);
  101.   }
  102.   
  103.   s->trap_rev = get_short(data+184);
  104.   
  105.   return 0;
  106. }
  107.  
  108. int sys_UnpackRegisters(void * data, struct Pilot_registers * r)
  109. {
  110.   unsigned char * buffer = data;
  111.   r->D[0] = get_long(buffer+0);
  112.   r->D[1] = get_long(buffer+4);
  113.   r->D[2] = get_long(buffer+8);
  114.   r->D[3] = get_long(buffer+12);
  115.   r->D[4] = get_long(buffer+16);
  116.   r->D[5] = get_long(buffer+20);
  117.   r->D[6] = get_long(buffer+24);
  118.   r->D[7] = get_long(buffer+28);
  119.   r->A[0] = get_long(buffer+32);
  120.   r->A[1] = get_long(buffer+36);
  121.   r->A[2] = get_long(buffer+40);
  122.   r->A[3] = get_long(buffer+44);
  123.   r->A[4] = get_long(buffer+48);
  124.   r->A[5] = get_long(buffer+52);
  125.   r->A[6] = get_long(buffer+56);
  126.   r->USP = get_long(buffer+60);
  127.   r->SSP = get_long(buffer+64);
  128.   r->PC = get_long(buffer+68);
  129.   r->SR = get_short(buffer+72);
  130.   
  131.   return 0;
  132. }
  133.  
  134. int sys_PackRegisters(void * data, struct Pilot_registers * r)
  135. {
  136.   unsigned char * buffer = data;
  137.   int i;
  138.   for (i=0;i<8;i++)
  139.     set_long(buffer+i*4, r->D[i]);
  140.   for (i=0;i<7;i++)
  141.     set_long(buffer+32+i*4, r->A[i]);
  142.   set_long(buffer+60, r->USP);
  143.   set_long(buffer+64, r->SSP);
  144.   set_long(buffer+68, r->PC);
  145.   set_short(buffer+72, r->SR);
  146.   
  147.   return 0;
  148. }
  149.  
  150. int sys_Continue(int sd, struct Pilot_registers * r, struct Pilot_watch * w)
  151. {
  152.   char buf[94];
  153.   
  154.   buf[0] = 0;
  155.   buf[1] = 0;
  156.   buf[2] = 0;
  157.   buf[3] = 0;
  158.   
  159.   buf[4] = 0x07;
  160.   buf[5] = 0; /*gapfil*/
  161.   
  162.   if (!r)
  163.     return pi_write(sd,buf,6);
  164.   
  165.   sys_PackRegisters(buf+6, r);
  166.   set_byte(buf+80, (w != 0) ? 1 : 0);
  167.   set_byte(buf+81, 0);
  168.   set_long(buf+82, w ? w->address : 0);
  169.   set_long(buf+86, w ? w->length : 0);
  170.   set_long(buf+90, w ? w->checksum : 0);
  171.   
  172.   return pi_write(sd, buf, 94);
  173. }
  174.  
  175. int sys_Step(int sd)
  176. {
  177.   char buf[94];
  178.   
  179.   buf[0] = 0;
  180.   buf[1] = 0;
  181.   buf[2] = 0;
  182.   buf[3] = 0;
  183.   
  184.   buf[4] = 0x03;
  185.   buf[5] = 0; /*gapfil*/
  186.   
  187.   return pi_write(sd,buf,6);
  188. }
  189.  
  190. int sys_SetBreakpoints(int sd, struct Pilot_breakpoint * b)
  191. {
  192.   char buf[94];
  193.   int i;
  194.   
  195.   buf[0] = 0;
  196.   buf[1] = 0;
  197.   buf[2] = 0;
  198.   buf[3] = 0;
  199.   
  200.   buf[4] = 0x0c;
  201.   buf[5] = 0; /*gapfil*/
  202.   
  203.   for (i=0;i<6;i++) {
  204.     set_long(buf+6+i*6, b[i].address);
  205.     set_byte(buf+10+i*6, b[i].enabled);
  206.     set_byte(buf+11+i*6, 0);
  207.   }
  208.   
  209.   pi_write(sd, buf, 42);
  210.   
  211.   i = pi_read(sd, buf, 6);
  212.  
  213.   if ((i<=0) || (buf[4] != (char)0x8c))
  214.     return 0;
  215.   else
  216.     return 1;
  217. }
  218.  
  219. int sys_SetTrapBreaks(int sd, int * traps)
  220. {
  221.   char buf[94];
  222.   int i;
  223.   
  224.   buf[0] = 0;
  225.   buf[1] = 0;
  226.   buf[2] = 0;
  227.   buf[3] = 0;
  228.   
  229.   buf[4] = 0x11;
  230.   buf[5] = 0; /*gapfil*/
  231.   
  232.   for (i=0;i<5;i++) {
  233.     set_short(buf+6+i*2, traps[i]);
  234.   }
  235.   
  236.   pi_write(sd, buf, 16);
  237.   
  238.   i = pi_read(sd, buf, 6);
  239.  
  240.   if ((i<=0) || (buf[4] != (char)0x91))
  241.     return 0;
  242.   else
  243.     return 1;
  244. }
  245.  
  246. int sys_GetTrapBreaks(int sd, int * traps)
  247. {
  248.   char buf[94];
  249.   int i;
  250.   
  251.   buf[0] = 0;
  252.   buf[1] = 0;
  253.   buf[2] = 0;
  254.   buf[3] = 0;
  255.   
  256.   buf[4] = 0x10;
  257.   buf[5] = 0; /*gapfil*/
  258.   
  259.   pi_write(sd, buf, 6);
  260.   
  261.   i = pi_read(sd, buf, 16);
  262.  
  263.   if ((i<16) || (buf[4] != (char)0x90))
  264.     return 0;
  265.  
  266.   for (i=0;i<5;i++) {
  267.     traps[i] = get_short(buf+6+i*2);
  268.   }
  269.  
  270.   return 1;
  271. }
  272.  
  273. int sys_ToggleDbgBreaks(int sd)
  274. {
  275.   char buf[94];
  276.   int i;
  277.   
  278.   buf[0] = 0;
  279.   buf[1] = 0;
  280.   buf[2] = 0;
  281.   buf[3] = 0;
  282.   
  283.   buf[4] = 0x0d;
  284.   buf[5] = 0; /*gapfil*/
  285.   
  286.   pi_write(sd, buf, 6);
  287.   
  288.   i = pi_read(sd, buf, 7);
  289.  
  290.   if ((i<7) || (buf[4] != (char)0x8d))
  291.     return 0;
  292.  
  293.   return get_byte(buf+6);
  294. }
  295.  
  296. int sys_QueryState(int sd)
  297. {
  298.   char buf[6];
  299.   
  300.   buf[0] = 0;
  301.   buf[1] = 0;
  302.   buf[2] = 0;
  303.   buf[3] = 0;
  304.   
  305.   buf[4] = 0;
  306.   buf[5] = 0; /*gapfil*/
  307.   
  308.   return pi_write(sd, buf, 6);
  309. }
  310.  
  311. int sys_ReadMemory(int sd, unsigned long addr, unsigned long len, void * dest)
  312. {
  313.   int result;
  314.   unsigned char buf[0xffff];
  315.   unsigned long todo,done;
  316.   
  317.   
  318.   done = 0;
  319.   do {
  320.     todo = len;
  321.     if (todo > 256)
  322.       todo = 256;
  323.  
  324.     buf[0] = 0;
  325.     buf[1] = 0;
  326.     buf[2] = 0;
  327.     buf[3] = 0;
  328.   
  329.     buf[4] = 0x01;
  330.     buf[5] = 0; /*gapfil*/
  331.   
  332.     set_long(buf+6, addr+done);
  333.     set_short(buf+10, todo);
  334.   
  335.     pi_write(sd, buf, 12);
  336.   
  337.     result = pi_read(sd, buf, todo+6);
  338.   
  339.     if (result<0)
  340.       return done;
  341.   
  342.     if ((buf[4] == 0x81) && ((unsigned int)result == todo+6)) {
  343.       memcpy(((char *)dest) + done, buf+6, todo);
  344.       done += todo;
  345.     } else {
  346.       return done;
  347.     }
  348.   } while (done < len);
  349.   return done;
  350. }
  351.  
  352. int sys_WriteMemory(int sd, unsigned long addr, unsigned long len, void * src)
  353. {
  354.   int result;
  355.   unsigned char buf[0xffff];
  356.   unsigned long todo, done;
  357.   
  358.   
  359.   done = 0;
  360.   do {
  361.     todo = len;
  362.     if (todo>256)
  363.       todo = 256;
  364.  
  365.     buf[0] = 0;
  366.     buf[1] = 0;
  367.     buf[2] = 0;
  368.     buf[3] = 0;
  369.   
  370.     buf[4] = 0x02;
  371.     buf[5] = 0; /*gapfil*/
  372.  
  373.   
  374.     set_long(buf+6, addr);
  375.     set_short(buf+10, len);
  376.     memcpy(buf+12, ((char *)src)+done, todo);
  377.   
  378.     pi_write(sd, buf, len+12);
  379.   
  380.     result = pi_read(sd, buf, 6);
  381.   
  382.     if (result<0)
  383.       return done;
  384.    
  385.     if ((buf[4] == 0x82) && ((unsigned int)result == todo+6)) {
  386.       ;
  387.     } else {
  388.       return done;
  389.     }
  390.   } while (done < len);
  391.   return done;
  392.  
  393. int sys_Find(int sd, unsigned long startaddr, unsigned long stopaddr, int len, int caseinsensitive,
  394.              void * data, unsigned long * found)
  395. {
  396.   int result;
  397.   unsigned char buf[0xffff];
  398.   
  399.   buf[0] = 0;
  400.   buf[1] = 0;
  401.   buf[2] = 0;
  402.   buf[3] = 0;
  403.   
  404.   buf[4] = 0x11;
  405.   buf[5] = 0; /*gapfil*/
  406.   
  407.   set_long(buf+6, startaddr);
  408.   set_long(buf+10, stopaddr);
  409.   set_short(buf+14, len);
  410.   set_byte(buf+16, caseinsensitive);
  411.   memcpy(buf+17, data, len);
  412.   
  413.   pi_write(sd, buf, len+17);
  414.   
  415.   result = pi_read(sd, buf, 12);
  416.   
  417.   if (result<0)
  418.     return result;
  419.     
  420.   if (found)
  421.     *found = get_long(buf+6);
  422.   
  423.   return get_byte(buf+10);
  424. }
  425.  
  426.  
  427. int sys_RemoteEvent(int sd, int penDown, int x, int y, int keypressed, 
  428.                        int keymod, int keyasc, int keycode)
  429. {
  430.   char buf[20];
  431.   
  432.   buf[0] = 2;
  433.   buf[1] = 2;
  434.   buf[2] = 0;
  435.   buf[3] = 0x11;
  436.   
  437.   buf[4] = 0x0d; /*RemoteEvtCommand*/
  438.   buf[5] = 0; /*gapfil*/
  439.   buf[6] = penDown;
  440.   buf[7] = 0; /*gapfil*/
  441.   buf[8] = x >> 8;
  442.   buf[9] = x & 0xff;
  443.   buf[10] = y >> 8;
  444.   buf[11] = y & 0xff;
  445.   buf[12] = keypressed;
  446.   buf[13] = 0; /*gapfil*/
  447.   buf[14] = keymod >> 8;
  448.   buf[15] = keymod & 0xff;
  449.   buf[16] = keyasc >> 8;
  450.   buf[17] = keyasc & 0xff;
  451.   buf[18] = keycode >> 8;
  452.   buf[19] = keycode & 0xff;
  453.   
  454.   return pi_write(sd, buf, 16+4);
  455. }
  456.  
  457. int sys_RPC(int sd, int socket, int trap, long * D0, long * A0, int params, struct RPC_param * param, int reply)
  458. {
  459.   unsigned char buf[4096];
  460.   int i;
  461.   unsigned char * c;
  462.   
  463.   buf[0] = socket; /* 0 for debug, 1 for console */
  464.   buf[1] = socket;
  465.   buf[2] = 0;
  466.   buf[4] = 0x0a;
  467.   buf[5] = 0;
  468.   
  469.   set_short(buf+6, trap);
  470.   set_long(buf+8, *D0);
  471.   set_long(buf+12, *A0);
  472.   set_short(buf+16, params);
  473.   
  474.   c = buf+18;
  475.   for(i=params-1;i>=0;i--) {
  476.     set_byte(c, param[i].byRef); c++;
  477.     set_byte(c, param[i].size); c++;
  478.     if(param[i].data)
  479.       memcpy(c, param[i].data, param[i].size);
  480.     c += param[i].size;
  481.     if (param[i].size & 1)
  482.       *c++ = 0;
  483.   }
  484.   
  485.   if (socket == 3)
  486.     set_short(buf+4, c-buf - 6);
  487.   
  488.   pi_write(sd, buf, c-buf);
  489.   
  490.   if(reply) {
  491.     int l = pi_read(sd, buf, 4096);
  492.   
  493.     if (l < 0)
  494.       return l;
  495.     if (l < 6)
  496.       return -1;
  497.     if (buf[4] != 0x8a)
  498.       return -2;
  499.     
  500.     *D0 = get_long(buf+8);
  501.     *A0 = get_long(buf+12);
  502.     c = buf+18;
  503.     for(i=params-1;i>=0;i--) {
  504.       if(param[i].byRef && param[i].data)
  505.         memcpy(param[i].data, c+2, param[i].size);
  506.       c += 2 + ((get_byte(c+1) + 1)& ~1);
  507.     }
  508.   }
  509.   return 0;
  510. }
  511.  
  512. /* Deprecated */
  513. int RPC(int sd, int socket, int trap, int reply, ...)
  514. {
  515.   va_list ap;
  516.   struct RPC_param p[20];
  517.   int RPC_arg[20];
  518.   int i=0,j;
  519.   long D0=0,A0=0;
  520.  
  521.   va_start(ap, reply);
  522.   for(;;) {
  523.     int type = va_arg(ap, int);
  524.     if(type == 0)
  525.       break;
  526.     if(type < 0) {
  527.       p[i].byRef = 0;
  528.       p[i].size = -type;
  529.       RPC_arg[i] = va_arg(ap,int);
  530.       p[i].data = &RPC_arg[i];
  531.       p[i].invert = 0;
  532.     } else {
  533.       void * c = va_arg(ap,void*);
  534.       p[i].byRef = 1;
  535.       p[i].size = type;
  536.       p[i].data = c;
  537.       p[i].invert = va_arg(ap,int);
  538.       if(p[i].invert) {
  539.         if(p[i].size == 2) {
  540.           int * s = c;
  541.           *s = htons(*s);
  542.         } else {
  543.           int * l = c;
  544.           *l = htonl(*l);
  545.         }
  546.       }
  547.     }
  548.     i++;
  549.   }
  550.   va_end(ap);
  551.   
  552.   sys_RPCerror = sys_RPC(sd, socket, trap, &D0, &A0, i, p, reply != 2);
  553.   
  554.   for(j=0;j<i;j++) {
  555.       if(p[j].invert) {
  556.         void * c = p[j].data;
  557.         if(p[j].size == 2) {
  558.           int * s = c;
  559.           *s = htons(*s);
  560.         } else {
  561.           int * l = c;
  562.           *l = htonl(*l);
  563.         }
  564.       }
  565.   }
  566.   
  567.   if(reply)
  568.     return A0;
  569.   else
  570.     return D0;
  571. }
  572.  
  573. int PackRPC(struct RPC_params * p, int trap, int reply, ...)
  574. {
  575.   va_list ap;
  576.   int i=0;
  577.   
  578.   p->trap = trap;
  579.   p->reply = reply;
  580.  
  581.   va_start(ap, reply);
  582.   for(;;) {
  583.     int type = (int)va_arg(ap, int);
  584.     if(type == 0)
  585.       break;
  586.     if(type < 0) {
  587.       p->param[i].byRef = 0;
  588.       p->param[i].size = -type;
  589.       p->param[i].arg = (int)va_arg(ap, int);
  590.       p->param[i].data = &p->param[i].arg;
  591.       p->param[i].invert = 0;
  592.     } else {
  593.       void * c = (void*)va_arg(ap,void*);
  594.       p->param[i].byRef = 1;
  595.       p->param[i].size = type;
  596.       p->param[i].data = c;
  597.       p->param[i].invert = (int)va_arg(ap,int);
  598.     }
  599.     i++;
  600.   }
  601.   p->args = i;
  602.   va_end(ap);
  603.   
  604.   return 0;
  605. }
  606.  
  607. void UninvertRPC(struct RPC_params * p)
  608. {
  609.   int j;
  610.   
  611.   for(j=0;j<p->args;j++) {
  612.       if(p->param[j].invert) {
  613.         void * c = p->param[j].data;
  614.         if((p->param[j].invert == 2) && (p->param[j].size == 2)) {
  615.           int * s = c;
  616.           *s = htons(*s)>>8;
  617.         } else if(p->param[j].size == 2) {
  618.           int * s = c;
  619.           *s = htons(*s);
  620.         } else {
  621.           long * l = c;
  622.           *l = htonl(*l);
  623.         }
  624.       }
  625.   }
  626. }
  627.  
  628. void InvertRPC(struct RPC_params * p)
  629. {
  630.   int j;
  631.   
  632.   for(j=0;j<p->args;j++) {
  633.       if(p->param[j].invert) {
  634.         void * c = p->param[j].data;
  635.         if((p->param[j].invert == 2) && (p->param[j].size == 2)) {
  636.           int * s = c;
  637.           *s = ntohs(*s)>>8;
  638.         } else if(p->param[j].size == 2) {
  639.           int * s = c;
  640.           *s = ntohs(*s);
  641.         } else {
  642.           long * l = c;
  643.           *l = ntohl(*l);
  644.         }
  645.       }
  646.   }
  647. }
  648.  
  649.  
  650. unsigned long DoRPC(int sd, int socket, struct RPC_params * p, int * error)
  651. {
  652.   int err;
  653.   long D0=0,A0=0;
  654.   
  655.   InvertRPC(p);
  656.  
  657.   err = sys_RPC(sd, socket, p->trap, &D0, &A0, p->args, &p->param[0], p->reply);
  658.   
  659.   UninvertRPC(p);
  660.   
  661.   if (error)
  662.     *error = err;
  663.   
  664.   if(p->reply==RPC_PtrReply)
  665.     return A0;
  666.   else if (p->reply==RPC_IntReply)
  667.     return D0;
  668.   else
  669.     return err;
  670. }
  671.  
  672. int RPC_Int_Void(int sd, int trap) {
  673.   return RPC(sd, 1, trap, 0, RPC_End);
  674. }
  675.  
  676. int RPC_Ptr_Void(int sd, int trap) {
  677.   return RPC(sd, 1, trap, 1, RPC_End);
  678. }
  679.  
  680. /* Untested complex RPC example
  681. int RPC_MemCardInfo(int sd, int cardno, char * cardname, char * manufname,
  682.                     int * version, long * date, long * romsize, long * ramsize,
  683.                     long * freeram) {
  684.   return RPC(sd, 1, 0xA004, 0, RPC_Short(cardno), RPC_Ptr(cardname, 32), 
  685.                                RPC_Ptr(manufname, 32), RPC_ShortPtr(version),
  686.                                RPC_LongPtr(date), RPC_LongPtr(romsize),
  687.                                RPC_LongPtr(ramsize), RPC_LongPtr(freeram));
  688. }                    
  689. */
  690.